perm filename M[AP,SYS]4 blob
sn#015889 filedate 1972-12-23 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 Start of program: main loop.
00003 00003 Start of program: main loop.
00005 00004 Subroutines: TOTS.
00008 00005 Subroutines: NXTDG.
00009 00006 Subroutines: START, RESTAR, STOPIT.
00011 00007 Run INITER on a pty.
00015 ENDMK
⊗;
;Start of program: main loop.
TITLE M
↓CHAR←2
↓AC1 ←3
↓BOT ←4
↓CNT ←5
↓QUO ←6
↓REM ←7
↓DX ←10
↓BOT ←11
↓BP ←12
↓CHR ←13
↓CMD ←14
↓A ←15
↓P ←17
↓CR←15 ↓LF←12 ↓ALT←175
PDLEN←30
↓NPNS←200
PDLIST: BLOCK PDLEN
NAME: BLOCK NPNS*2
COUNT←NAME+1
LTR: BLOCK =32
BLANKS: ASCII / /
DIGITS: BLOCK 4
USERSF: SIXBIT /USERS/
BLOCK 3
IBUF: BLOCK 3
UCMD: IOWD 2,NAME+2
0
WAKEBK: SIXBIT /[-AP-]/
SIXBIT / APSYS/
0
DEFINE CHKANS {
INCHRW CHAR
CAIE CHAR,"Y"
CAIN CHAR,"y"}
OPDEF INWAIT [TTYUUO 14,]
;Start of program: main loop.
FAILED: OUTSTR [ASCIZ / FAILED!
/]
M: CALLI
OUTSTR [ASCIZ/
*/]
MOVE P,[IOWD PDLEN,PDLIST]
MOVE BP,[POINT 7,CMD]
SETZ CMD,
MOVEI CNT,5
JRST GETCH
PUTCH: SOJL CNT,GETCH
TLZ CHR,40
IDPB CHR,BP
GETCH: INCHWL CHR
CAIE CHR,CR
JRST PUTCH
INCHWL CHR
CAIE CHR,LF
JRST BADCMD
CAMN CMD,[ASCII /START/]
JRST START
CAMN CMD,[ASCII /STOP /]
JRST STOPIT
CAMN CMD,[ASCII /REST /]
JRST RESTAR
CAMN CMD,[ASCII /USERS/]
JRST TOTS
BADCMD: OUTSTR [ASCIZ /
?ILLEGAL COMMAND
/]
JRST M
DONE: OUTSTR [ASCIZ /DONE/]
CALLI 12 ;EXIT
;Subroutines: TOTS.
BEGIN TOTS
↑TOTS: OUTSTR [ASCIZ/
/]
MOVEI BOT,2
SETZM COUNT
SETZM NAME
INIT 0,10
SIXBIT /DSK/
IBUF
HALT .
SETZM USERSF+3
LOOKUP 0,USERSF
JRST FAILED
GETNAM: SOSG IBUF+2
IN 0,
JRST [ILDB AC1,IBUF+1 ;GET PN
ILDB CNT,IBUF+1 ;GET COUNT FIELD FOR THIS PN
SOS IBUF+2
JUMPN AC1,FIND
JRST GETNAM]
STATO 0,20000
HALT .
RELEAS 0,
EOF: MOVNI AC1,-2(BOT)
HRLM AC1,UCMD
CAILE BOT,2
JRST NNN
OUTSTR [ASCIZ /
NO USERS YET.
/]
JRST DONE
FIND:
MOVE DX,BOT
NEXT: SUBI DX,2
CAME AC1,NAME(DX)
JUMPG DX,NEXT
JUMPN CNT,.+2 ;IS THE COUNT FIELD ZERO?
MOVEI CNT,1 ;YES. IMPLICIT COUNT OF 1.
ADDM CNT,COUNT ;ADD TO TOTAL COUNT OF PNs
JUMPLE DX,INSERT
ADDM CNT,COUNT(DX)
JRST GETNAM
INSERT: CAIL BOT,2*NPNS
JRST [OUTSTR [ASCIZ / TOO MANY PNS. /]
JRST FAILED]
MOVEM AC1,NAME(BOT)
MOVEM CNT,COUNT(BOT)
ADDI BOT,2
JRST GETNAM
PRNTNX: OUTSTR NAME(BOT)
MOVE BP,[POINT 7,DIGITS]
MOVE QUO,COUNT(BOT)
PUSHJ P,NXTDG
MOVEI QUO,CR
IDPB QUO,BP
MOVEI QUO,LF
IDPB QUO,BP
MOVEI QUO,0
IDPB QUO,BP
OUTSTR BLANKS
NNN: SUBI BOT,2
JUMPGE BOT,PRNTNX
INIT 0,17
SIXBIT /DSK/
0
HALT .
SETZM USERSF+1
SETZM USERSF+2
SETZM USERSF+3
ENTER 0,USERSF
JRST [OUTSTR [ASCIZ /
No new file written.
/]
JRST FIN]
OUT 0,UCMD
JRST FIN
RELEAS 0,3
OUTSTR [ASCIZ /
OUT UUO failed for new file.
/]
JRST DONE
FIN: RELEAS 0,
JRST DONE
BEND
;Subroutines: NXTDG.
NXTDG: IDIVI QUO,=10
PUSH P,REM
SKIPE QUO
PUSHJ P,NXTDG
POP P,QUO
ADDI QUO,60
IDPB QUO,BP
POPJ P,
;Subroutines: START, RESTAR, STOPIT.
BEGIN STOPIT
↑START: MOVEI AC1,WAKEBK
SETZM WAKEBK+2 ;set wakeup value to NOW
CALLI AC1,400061 ;WAKEME
JRST FAILED
JRST DONE
↑RESTAR:SETOM STARTUP#
JRST STOP1
REST2: OUTSTR [ASCIZ/STOPPED.../]
MOVEI AC1,=8
CALLI AC1,31 ;SLEEP for 8 seconds
OUTSTR [ASCIZ/STARTING.../]
JRST START
↑STOPIT:SETZM STARTUP
MOVEI AC1,WAKEBK
SETOM WAKEBK+2 ;set wakeup value to NEVER
CALLI AC1,400061 ;WAKEME
JRST FAILED
STOP1:
PPIOT 6,-2000 ;move line editor position off screen
CALLI 400001 ;CTLV. turn off duplexing
OUTCHR ["."]
INWAIT
CALLI 400001 ;CTLF. turn on duplexing
PPIOT 6, ;replace line editor in standard position
MOVE BP,[POINT 7,LTR]
MOVEI CNT,5*=32
JRST LOACHR
STOCHR: SOJLE CNT,.+2
IDPB CHR,BP
LOACHR: INCHWL CHR
CAIE CHR,ALT
JRST STOCHR
SETZ CHR,
IDPB CHR,BP
MOVEI A,DONE
SKIPE STARTUP
MOVEI A,REST2
TEST: MAIL 5,[SIXBIT /[-AP-]/
LTR]
JRST FAILED
JRST (A)
OUTSTR [ASCIZ /
[-AP-] does not exist!
/]
JRST FAILED
BEND STOPIT
;Run INITER on a pty.
MKNEWS: RELEAS 0,
PTYGET PINITE ;start up INITER on a PTY
UBIGERR 44 ; ;COULD NOT GET A PTY TO START UP INITER
MOVEI A,PINITE+2
MOVEM A,PINITE+1
PTWRS7 PINITE
CTRLC: PTRD1W PINITE
MOVE A,PINITE+1 ;read char from pty
CAIE A,136 ;read from pty until ↑
JRST CTRLC
PTRD1W PINITE
MOVE A,PINITE+1
CAIE A,103 ; and C
JRST CTRLC
GETDOT: PTRD1W PINITE
MOVE A,PINITE+1
CAIE A,56 ;read from pty until find period (monitor level)
JRST GETDOT
;Create NEWS and INDEX files.
OPEN 0,DSK17 ;prepare to create new NEWS file
UBIGERR 50 ; ;OPEN FAILED ON DSK
SETZM NEWSF+1
SETZM NEWSF+2
SETZM NEWSF+3
OUTSTR [ASCIZ / MAKING-NEWS /]
ENTER 0,NEWSF ;create NEWS file
UBIGERR 54 ; ;ENTER FAILED DURING ATTEMPT TO CREATE NEWS FILE
SETZM BUF ;zero the first word in the story buffer
OUT 0,CMD ;write out 1 zero word in NEWS
JRST .+2
UBIGERR 60 ; ;OUT UUO FAILED ATTEMPTING TO INITIALIZE NEWS FILE
PUSHJ P,GROW ;expand to full core size
OPEN 1,DSK17 ;prepare to create INDEX file
UBIGERR 64 ; ;OPEN FAILED ON DSK
SETZM INDEXF+1
SETZM INDEXF+2
SETZM INDEXF+3
ENTER 1,INDEXF ;INDEX file
UBIGERR 70 ; ;ENTER FAILED DURING ATTEMPT TO CREATE INDEX FILE
MOVEI UNDUN,XSIZE+SPECS;initialize special pointers
MOVEM UNDUN,INDEX
MOVEI NEW,XSIZE+SPECS
MOVEM NEW,INDEX+1
MOVEI OLD,SPECS
MOVEM OLD,INDEX+2
MOVE A,[XWD 1,4000]
MOVEM A,INDEX+1(NEW) ;initialize index information for NEW area
MOVE A,[XWD 10,4000]
MOVEM A,INDEX+1(OLD) ;initialize index information for OLD area
OUT 1,XCMD ;write out INDEX file
JRST .+2
UBIGERR 74 ; ;OUT UUO FAILED TO WRITE OUT INITIAL INDEX FILE
PUSHJ P,SHRINK ;minimize core size
ADDI BPTR,1 ;increase byte pointer beyond 1-word short story
INITED: PTRD1W PINITE ;get a char from INITER
MOVE A,PINITE+1
CAIE A,36 ;is char a "≡"?
JRST INITED ;no
PTRD1W PINITE ;yes. get another char
MOVE A,PINITE+1
CAIE A,41 ;is char a "!"?
UBIGERR 100 ; ;INITER DETECTED AN ERROR AND DIDN'T FINISH
PTYREL PINITE ;yes. INITER is done. release its PTY.
RELEAS 1, ;INDEX file after INITER has succeeded
END M